home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / CD_UTIL / CDPLAY / CDC.PAS < prev    next >
Pascal/Delphi Source File  |  1992-12-09  |  18KB  |  734 lines

  1. {$X+}
  2.  
  3. unit cdc;
  4.  
  5. interface
  6.  
  7. uses WinTypes, Strings;
  8.  
  9. const
  10.   MCI_Notify            = $03B9;    { MCI Notification Message }
  11.   MCI_Notify_Successful = 1;
  12.   MCI_Notify_Superseded = 2;
  13.   MCI_Notify_Aborted    = 4;
  14.   MCI_Notify_Failure    = 8;
  15.  
  16.  
  17. Type
  18.   TimeTMSF = Record
  19.     Tracks,
  20.     Minutes,
  21.     Seconds,
  22.     Frames   : Integer;
  23.   end;
  24.  
  25.   TrackRecord = Record
  26.     Minutes,
  27.     Seconds,
  28.     Frames : Integer;
  29.     StartMin,
  30.     StartSec,
  31.     StartFrame : Integer;
  32.   end;
  33.  
  34. Var
  35.   WinHandle  : HWnd;
  36.   MixerAvail : Boolean;
  37.   CDAvail    : Boolean;
  38.   NumTracks  : Integer;
  39.   Paused     : Boolean;
  40.   Repeating  : Boolean;
  41.  
  42. FUNCTION mciSendString (pSendString: Pointer;
  43.     PReturnString: Pointer; wReturnStringLength: WORD; hCallback: THandle) : LONGINT;
  44. FUNCTION mciGetErrorString (liErrorCode: LONGINT; pErrorBuffer: pointer;
  45.     wBufferLength: WORD) : WORD;
  46.  
  47. function CanPlay : Boolean;
  48.  
  49. function OpenCD : Boolean;
  50.  
  51. function StopCD : Boolean;
  52.  
  53. function CloseCD : Boolean;
  54.  
  55. function PauseCD : Boolean;
  56.  
  57. function ResumeCD : Boolean;
  58.  
  59. function PlayCD(FrTrack, ToTrack : Integer) : Boolean;
  60.  
  61. function EjectCD : Boolean;
  62.  
  63. function SetTMSF : Boolean;
  64.  
  65. function SetMSF : Boolean;
  66.  
  67. function CurrentTrack : Integer;
  68.  
  69. function LengthCD : String;
  70.  
  71. function LengthTrack(TrackNum : Integer) : String;
  72.  
  73. Function StartCD : String;
  74.  
  75. Function Position : String;
  76.  
  77. Function StartTrack(TrackNum : Integer) : String;
  78.  
  79. function Mode : String;
  80.  
  81. function NumberOfTracks : Integer;
  82.  
  83. function MediaPresent : Boolean;
  84.  
  85. function Ready : Boolean;
  86.  
  87. function OpenMixer : Boolean;
  88.  
  89. function CloseMixer : Boolean;
  90.  
  91. function Bass(Value : Integer) : Integer;
  92.  
  93. function Treble(Value : Integer) : Integer;
  94.  
  95. function MidRange(Value : Integer) : Integer;
  96.  
  97. function Volume(Channel : String; Value : Integer) : Integer;
  98.  
  99. function Reverb(Value : Integer) : Integer;
  100.  
  101. function Loudness(Value : Integer) : Integer;
  102.  
  103. function StereoEnhance(Value : Integer) : Integer;
  104.  
  105. procedure ConvTMSF(var TMSF_Rec : TimeTMSF;TStr : String);
  106.  
  107. procedure ConvMSF(var TMSF_Rec : TimeTMSF;TStr : String);
  108.  
  109. {********************************************************************}
  110.  
  111. implementation
  112.  
  113. {********************************************************************}
  114.  
  115. const
  116.   RetLen = 256;
  117.  
  118. FUNCTION MCIGetErrorString    ; EXTERNAL 'MMSYSTEM' INDEX   706;
  119. FUNCTION MCISendString        ; EXTERNAL 'MMSYSTEM' INDEX   702;
  120.  
  121. function CanPlay : Boolean;
  122. var
  123.   SendStr, RetStr : PChar;
  124.   Error           : LongInt;
  125. begin
  126.   GetMem(RetStr, 256);
  127.   SendStr := StrNew('capability cdaudio canplay');
  128.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  129.      CanPlay := FALSE
  130.   Else
  131.      CanPlay := (StrIComp(RetStr,'true') = 0);
  132.   Dispose(SendStr);
  133.   FreeMem(RetStr, 256);
  134. end;
  135.  
  136. function OpenCD : Boolean;
  137. var
  138.   SendStr, RetStr : PChar;
  139.   Error           : LongInt;
  140. begin
  141.   GetMem(RetStr, 256);
  142.   SendStr := StrNew('open cdaudio shareable');
  143.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  144.      OpenCD := FALSE
  145.   Else
  146.      OpenCD := TRUE;
  147.   Dispose(SendStr);
  148.   FreeMem(RetStr, 256);
  149. end;
  150.  
  151. function StopCD : Boolean;
  152. var
  153.   SendStr, RetStr : PChar;
  154.   Error           : LongInt;
  155. begin
  156.   GetMem(RetStr, 256);
  157.   SendStr := StrNew('stop cdaudio');
  158.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  159.      StopCD := FALSE
  160.   Else
  161.      StopCD := TRUE;
  162.   Dispose(SendStr);
  163.   FreeMem(RetStr, 256);
  164. end;
  165.  
  166. function CloseCD : Boolean;
  167. var
  168.   SendStr, RetStr : PChar;
  169.   Error           : LongInt;
  170. begin
  171.   GetMem(RetStr, 256);
  172.   SendStr := StrNew('close cdaudio');
  173.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  174.      CloseCD := FALSE
  175.   Else
  176.      CloseCD := TRUE;
  177.   Dispose(SendStr);
  178.   FreeMem(RetStr, 256);
  179. end;
  180.  
  181. function SetTMSF : Boolean;
  182. var
  183.   SendStr, RetStr : PChar;
  184.   Error           : LongInt;
  185. begin
  186.   GetMem(RetStr, 256);
  187.   SendStr := StrNew('set cdaudio time format tmsf');
  188.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  189.      SetTMSF := FALSE
  190.   Else
  191.      SetTMSF := TRUE;
  192.   Dispose(SendStr);
  193.   FreeMem(RetStr, 256);
  194. end;
  195.  
  196. function SetMSF : Boolean;
  197. var
  198.   SendStr, RetStr : PChar;
  199.   Error           : LongInt;
  200. begin
  201.   GetMem(RetStr, 256);
  202.   SendStr := StrNew('set cdaudio time format msf');
  203.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  204.      SetMSF := FALSE
  205.   Else
  206.      SetMSF := TRUE;
  207.   Dispose(SendStr);
  208.   FreeMem(RetStr, 256);
  209. end;
  210.  
  211. function CurrentTrack : Integer;
  212. var
  213.   SendStr, RetStr : PChar;
  214.   Error           : LongInt;
  215.   Num, Code       : Integer;
  216. begin
  217.   GetMem(RetStr, 256);
  218.   SendStr := StrNew('status cdaudio current track');
  219.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  220.      Num := 0
  221.   Else
  222.      Val(RetStr, Num, Code);
  223.   Dispose(SendStr);
  224.   FreeMem(RetStr, 256);
  225.   CurrentTrack := Num;
  226. end;
  227.  
  228. Function LengthCD : String;
  229. var
  230.   SendStr, RetStr : PChar;
  231.   SStr            : String;
  232.   Error           : LongInt;
  233.   Num, Code       : Integer;
  234. begin
  235.   GetMem(RetStr, 256);
  236.   SendStr := StrNew('status cdaudio length');
  237.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  238.      SStr := '0'
  239.   Else
  240.      SStr := StrPas(RetStr);
  241.   Dispose(SendStr);
  242.   FreeMem(RetStr, 256);
  243.   LengthCD := SStr;
  244. end;
  245.  
  246. function LengthTrack(TrackNum : Integer) : String;
  247. var
  248.   SendStr, RetStr : PChar;
  249.   SStr            : String;
  250.   Error           : LongInt;
  251.   Num, Code       : Integer;
  252. begin
  253.   GetMem(RetStr, 256);
  254.   GetMem(SendStr, 64);
  255.   Str(TrackNum, SStr);
  256.   SStr := 'status cdaudio length track ' + SStr;
  257.   StrPCopy(SendStr, SStr);
  258.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  259.      SStr := '0'
  260.   Else
  261.      SStr := StrPas(RetStr);
  262.   FreeMem(SendStr, 64);
  263.   FreeMem(RetStr, 256);
  264.   LengthTrack := SStr;
  265. end;
  266.  
  267. Function StartCD : String;
  268. var
  269.   SendStr, RetStr : PChar;
  270.   SStr            : String;
  271.   Error           : LongInt;
  272.   Num, Code       : Integer;
  273. begin
  274.   GetMem(RetStr, 256);
  275.   SendStr := StrNew('status cdaudio start position');
  276.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  277.      SStr := '0'
  278.   Else
  279.      SStr := StrPas(RetStr);
  280.   Dispose(SendStr);
  281.   FreeMem(RetStr, 256);
  282.   StartCD := SStr;
  283. end;
  284.  
  285. Function Position : String;
  286. var
  287.   SendStr, RetStr : PChar;
  288.   SStr            : String;
  289.   Error           : LongInt;
  290.   Num, Code       : Integer;
  291. begin
  292.   GetMem(RetStr, 256);
  293.   SendStr := StrNew('status cdaudio position');
  294.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  295.      SStr := '0'
  296.   Else
  297.      SStr := StrPas(RetStr);
  298.   Dispose(SendStr);
  299.   FreeMem(RetStr, 256);
  300.   Position := SStr;
  301. end;
  302.  
  303. Function StartTrack(TrackNum : Integer) : String;
  304. var
  305.   SendStr, RetStr : PChar;
  306.   SStr            : String;
  307.   Error           : LongInt;
  308.   Num, Code       : Integer;
  309. begin
  310.   GetMem(RetStr, 256);
  311.   GetMem(SendStr, 64);
  312.   Str(TrackNum, SStr);
  313.   SStr := 'status cdaudio position track ' + SStr;
  314.   StrPCopy(SendStr, SStr);
  315.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  316.      SStr := '0'
  317.   Else
  318.      SStr := StrPas(RetStr);
  319.   FreeMem(SendStr, 64);
  320.   FreeMem(RetStr, 256);
  321.   StartTrack := SStr;
  322. end;
  323.  
  324.  
  325. function Mode : String;
  326. var
  327.   SendStr, RetStr : PChar;
  328.   SStr            : String;
  329.   Error           : LongInt;
  330.   Num, Code       : Integer;
  331. begin
  332.   GetMem(RetStr, 256);
  333.   SendStr := StrNew('status cdaudio mode');
  334.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  335.      SStr := 'not ready'
  336.   Else
  337.      SStr := StrPas(RetStr);
  338.   Dispose(SendStr);
  339.   FreeMem(RetStr, 256);
  340.   Mode := SStr;
  341. end;
  342.  
  343.  
  344. function NumberOfTracks : Integer;
  345. var
  346.   SendStr, RetStr : PChar;
  347.   Error           : LongInt;
  348.   Num, Code       : Integer;
  349. begin
  350.   GetMem(RetStr, 256);
  351.   SendStr := StrNew('status cdaudio number of tracks');
  352.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  353.      Num := 0
  354.   Else
  355.      Val(RetStr, Num, Code);
  356.   Dispose(SendStr);
  357.   FreeMem(RetStr, 256);
  358.   NumberOfTracks := Num;
  359. end;
  360.  
  361. function MediaPresent : Boolean;
  362. var
  363.   SendStr, RetStr : PChar;
  364.   Error           : LongInt;
  365. begin
  366.   GetMem(RetStr, 256);
  367.   SendStr := StrNew('status cdaudio media present');
  368.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  369.      MediaPresent := FALSE
  370.   Else
  371.      MediaPresent := (StrIComp(RetStr,'true') = 0);
  372.   Dispose(SendStr);
  373.   FreeMem(RetStr, 256);
  374. end;
  375.  
  376.  
  377. function Ready : Boolean;
  378. var
  379.   SendStr, RetStr : PChar;
  380.   Error           : LongInt;
  381. begin
  382.   GetMem(RetStr, 256);
  383.   SendStr := StrNew('status cdaudio ready');
  384.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  385.      Ready := FALSE
  386.   Else
  387.      Ready := (StrIComp(RetStr,'true') = 0);
  388.   Dispose(SendStr);
  389.   FreeMem(RetStr, 256);
  390. end;
  391.  
  392. function PauseCD : Boolean;
  393. var
  394.   SendStr, RetStr : PChar;
  395.   Error           : LongInt;
  396. begin
  397.   If Paused THEN
  398.      ResumeCD
  399.   ELSE
  400.   Begin
  401.     GetMem(RetStr, 256);
  402.     SendStr := StrNew('pause cdaudio');
  403.     If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  404.        PauseCD := FALSE
  405.     Else
  406.        PauseCD := TRUE;
  407.     Dispose(SendStr);
  408.     FreeMem(RetStr, 256);
  409.     Paused := TRUE;
  410.   End;
  411. end;
  412.  
  413. function ResumeCD : Boolean;
  414. var
  415.   SendStr, RetStr : PChar;
  416.   Error           : LongInt;
  417. begin
  418.   Paused := FALSE;
  419.   GetMem(RetStr, 256);
  420.   SendStr := StrNew('play cdaudio notify');
  421.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  422.      ResumeCD := FALSE
  423.   Else
  424.      ResumeCD := TRUE;
  425.   Dispose(SendStr);
  426.   FreeMem(RetStr, 256);
  427. end;
  428.  
  429. function PlayCD(FrTrack, ToTrack : Integer) : Boolean;
  430. var
  431.   SendStr,
  432.   RetStr : PChar;
  433.   Error           : LongInt;
  434.   FStr, TStr, SStr      : String;
  435. begin
  436.   If Paused Then
  437.      ResumeCD
  438.   ELSE
  439.   Begin
  440.     GetMem(RetStr, 256);
  441.     GetMem(SendStr, 64);
  442.     Str(FrTrack, FStr);
  443.     Str(ToTrack, TStr);
  444.     SStr := 'play cdaudio notify';
  445.     If FrTrack <> 0 THEN
  446.        SStr := SStr + ' from ' + FStr;
  447.     If ToTrack <> 0 THEN
  448.        SStr := SStr + ' to ' + TStr;
  449.     StrPCopy(SendStr, SStr);
  450.     If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  451.        PlayCD := FALSE
  452.     Else
  453.        PlayCD := TRUE;
  454.     FreeMem(SendStr, 64);
  455.     FreeMem(RetStr, 256);
  456.   End;
  457. end;
  458.  
  459. function EjectCD : Boolean;
  460. var
  461.   SendStr, RetStr : PChar;
  462.   Error           : LongInt;
  463. begin
  464.   GetMem(RetStr, 256);
  465.   SendStr := StrNew('set cdaudio door open');
  466.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  467.      EjectCD := FALSE
  468.   Else
  469.      EjectCD := TRUE;
  470.   Dispose(SendStr);
  471.   FreeMem(RetStr, 256);
  472. end;
  473.  
  474. function OpenMixer : Boolean;
  475. var
  476.   SendStr, RetStr : PChar;
  477.   Error           : LongInt;
  478. begin
  479.   GetMem(RetStr, 256);
  480.   SendStr := StrNew('open mixer shareable');
  481.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  482.      OpenMixer := FALSE
  483.   Else
  484.      OpenMixer := TRUE;
  485.   Dispose(SendStr);
  486.   FreeMem(RetStr, 256);
  487. end;
  488.  
  489. function CloseMixer : Boolean;
  490. var
  491.   SendStr, RetStr : PChar;
  492.   Error           : LongInt;
  493. begin
  494.   GetMem(RetStr, 256);
  495.   SendStr := StrNew('close mixer');
  496.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  497.      CloseMixer := FALSE
  498.   Else
  499.      CloseMixer := TRUE;
  500.   Dispose(SendStr);
  501.   FreeMem(RetStr, 256);
  502. end;
  503.  
  504.  
  505. function Bass(Value : Integer) : Integer;
  506. var
  507.   SendStr, RetStr : PChar;
  508.   SStr            : String;
  509.   Error           : LongInt;
  510.   Num, Code       : Integer;
  511. begin
  512.   GetMem(RetStr, 256);
  513.   Str(Value, SStr);
  514.   If Value >= 0 THEN
  515.      Begin
  516.        GetMem(SendStr, 64);
  517.        SStr := 'set mixer control bass Line_Out 1 to ' + SStr;
  518.        StrPCopy(SendStr, SStr);
  519.        mciSendString(SendStr, RetStr, RetLen, WinHandle);
  520.        FreeMem(SendStr, 64);
  521.      End;
  522.   SStr := 'get mixer control bass Line_Out 1';
  523.   GetMem(SendStr, 64);
  524.   StrPCopy(SendStr, SStr);
  525.   mciSendString(SendStr, RetStr, RetLen, WinHandle);
  526.   Val(RetStr, Num, Code);
  527.   FreeMem(SendStr, 64);
  528.   FreeMem(RetStr, 256);
  529.   Bass := Num;
  530. end;
  531.  
  532. function Treble(Value : Integer) : Integer;
  533. var
  534.   SendStr, RetStr : PChar;
  535.   SStr            : String;
  536.   Error           : LongInt;
  537.   Num, Code       : Integer;
  538. begin
  539.   GetMem(RetStr, 256);
  540.   Str(Value, SStr);
  541.   If Value >= 0 THEN
  542.      Begin
  543.        GetMem(SendStr, 64);
  544.        SStr := 'set mixer control treble Line_Out 1 to ' + SStr;
  545.        StrPCopy(SendStr, SStr);
  546.        mciSendString(SendStr, RetStr, RetLen, WinHandle);
  547.        FreeMem(SendStr, 64);
  548.      End;
  549.   SStr := 'get mixer control treble Line_Out 1';
  550.   GetMem(SendStr, 64);
  551.   StrPCopy(SendStr, SStr);
  552.   mciSendString(SendStr, RetStr, RetLen, WinHandle);
  553.   Val(RetStr, Num, Code);
  554.   FreeMem(SendStr, 64);
  555.   FreeMem(RetStr, 256);
  556.   Treble := Num;
  557. end;
  558.  
  559. function MidRange(Value : Integer) : Integer;
  560. var
  561.   SendStr, RetStr : PChar;
  562.   SStr            : String;
  563.   Error           : LongInt;
  564.   Num, Code       : Integer;
  565. begin
  566.   GetMem(RetStr, 256);
  567.   Str(Value, SStr);
  568.   If Value >= 0 THEN
  569.      Begin
  570.        GetMem(SendStr, 64);
  571.        SStr := 'set mixer control midrange Line_Out 1 to ' + SStr;
  572.        StrPCopy(SendStr, SStr);
  573.        mciSendString(SendStr, RetStr, RetLen, WinHandle);
  574.        FreeMem(SendStr, 64);
  575.      End;
  576.   SStr := 'get mixer control midrange Line_Out 1';
  577.   GetMem(SendStr, 64);
  578.   StrPCopy(SendStr, SStr);
  579.   mciSendString(SendStr, RetStr, RetLen, WinHandle);
  580.   Val(RetStr, Num, Code);
  581.   FreeMem(SendStr, 64);
  582.   FreeMem(RetStr, 256);
  583.   MidRange := Num;
  584. end;
  585.  
  586. function Volume(Channel : String; Value : Integer) : Integer;
  587. var
  588.   SendStr, RetStr : PChar;
  589.   SStr            : String;
  590.   Num, Code       : Integer;
  591. begin
  592.   GetMem(RetStr, 256);
  593.   Str(Value, SStr);
  594.   If Value >= 0 THEN
  595.      Begin
  596.        GetMem(SendStr, 64);
  597.        SStr := 'set mixer control volume ' + channel + ' Line_Out 1 to ' + SStr;
  598.        StrPCopy(SendStr, SStr);
  599.        mciSendString(SendStr, RetStr, RetLen, WinHandle);
  600.        FreeMem(SendStr, 64);
  601.      End;
  602.   SStr := 'get mixer control volume ' + channel + ' Line_Out 1';
  603.   GetMem(SendStr, 64);
  604.   StrPCopy(SendStr, SStr);
  605.   mciSendString(SendStr, RetStr, RetLen, WinHandle);
  606.   Val(RetStr, Num, Code);
  607.   FreeMem(SendStr, 64);
  608.   FreeMem(RetStr, 256);
  609.   Volume := Num;
  610. end;
  611.  
  612. function Reverb(Value : Integer) : Integer;
  613. var
  614.   SendStr, RetStr : PChar;
  615.   Num, Code       : Integer;
  616. begin
  617.   GetMem(RetStr, 256);
  618.   GetMem(SendStr, 64);
  619.   Case Value OF
  620.        -1 : SendStr := StrNew('set mixer both control reverb Line_Out 1 to 0');
  621.         0 : SendStr := StrNew('get mixer both control reverb Line_Out 1');
  622.         1 : SendStr := StrNew('set mixer both control reverb Line_Out 1 to 99');
  623.   End; { Case }
  624.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  625.      Num := -1000
  626.   Else
  627.      Val(RetStr, Num, Code);
  628.   Dispose(SendStr);
  629.   FreeMem(RetStr, 256);
  630.   Reverb := Num;
  631. end;
  632.  
  633. function Loudness(Value : Integer) : Integer;
  634. var
  635.   SendStr, RetStr : PChar;
  636.   Num, Code       : Integer;
  637. begin
  638.   GetMem(RetStr, 256);
  639.   GetMem(SendStr, 64);
  640.   Case Value OF
  641.        -1 : SendStr := StrNew('set mixer both control loudness Line_Out 1 to 0');
  642.         0 : SendStr := StrNew('get mixer both control loudness Line_Out 1');
  643.         1 : SendStr := StrNew('set mixer both control loudness Line_Out 1 to 99');
  644.   End; { Case }
  645.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  646.      Num := -1000
  647.   Else
  648.      Val(RetStr, Num, Code);
  649.   Dispose(SendStr);
  650.   FreeMem(RetStr, 256);
  651.   Loudness := Num;
  652. end;
  653.  
  654. function StereoEnhance(Value : Integer) : Integer;
  655. var
  656.   SendStr, RetStr : PChar;
  657.   Num, Code       : Integer;
  658. begin
  659.   GetMem(RetStr, 256);
  660.   GetMem(SendStr, 64);
  661.   Case Value OF
  662.        -1 : SendStr := StrNew('set mixer both control stereoenhance Line_Out 1 to 0');
  663.         0 : SendStr := StrNew('get mixer both control stereoenhance Line_Out 1');
  664.         1 : SendStr := StrNew('set mixer both control stereoenhance Line_Out 1 to 99');
  665.   End; { Case }
  666.   If (mciSendString(SendStr, RetStr, RetLen, WinHandle) <> 0) THEN
  667.      Num := -1000
  668.   Else
  669.      Val(RetStr, Num, Code);
  670.   Dispose(SendStr);
  671.   FreeMem(RetStr, 256);
  672.   StereoEnhance := Num;
  673. end;
  674.  
  675. procedure ConvTMSF(var TMSF_Rec : TimeTMSF;TStr : String);
  676. var
  677.   SLen : Integer;
  678.   SPos : Integer;
  679.   Code : Integer;
  680.   Temp : String;
  681. begin
  682.   If Length(TStr) < 11 THEN
  683.      FillChar(TMSF_Rec, SizeOf(TMSF_Rec), #0)
  684.   ELSE
  685.   Begin
  686.     Temp := Copy(TStr, 1, Pos(TStr, ':')-1);
  687.     Val(Temp, TMSF_Rec.Tracks, Code);
  688.     Delete(TStr, 1, Pos(':', TStr));
  689.  
  690.     Temp := Copy(TStr, 1, Pos(':', TStr)-1);
  691.     Val(Temp, TMSF_Rec.Minutes, Code);
  692.     Delete(TStr, 1, Pos(':', TStr));
  693.  
  694.     Temp := Copy(TStr, 1, Pos(':', TStr)-1);
  695.     Val(Temp, TMSF_Rec.Seconds, Code);
  696.     Delete(TStr, 1, Pos(':', TStr));
  697.  
  698.     Temp := TStr;
  699.     Val(Temp, TMSF_Rec.Frames, Code);
  700.   End;
  701. end;
  702.  
  703. procedure ConvMSF(var TMSF_Rec : TimeTMSF;TStr : String);
  704. var
  705.   SLen : Integer;
  706.   SPos : Integer;
  707.   Code : Integer;
  708.   Temp : String;
  709. begin
  710.   If Length(TStr) < 8 THEN
  711.      FillChar(TMSF_Rec, SizeOf(TMSF_Rec), #0)
  712.   ELSE
  713.   Begin
  714.     Temp := Copy(TStr, 1, Pos(':', TStr)-1);
  715.     Val(Temp, TMSF_Rec.Minutes, Code);
  716.     Delete(TStr, 1, Pos(':', TStr));
  717.  
  718.     Temp := Copy(TStr, 1, Pos(':', TStr)-1);
  719.     Val(Temp, TMSF_Rec.Seconds, Code);
  720.     Delete(TStr, 1, Pos(':', TStr));
  721.  
  722.     Temp := TStr;
  723.     Val(Temp, TMSF_Rec.Frames, Code);
  724.   End;
  725. End;
  726.  
  727. Begin
  728.   WinHAndle := 0;
  729.   MixerAvail := OpenMixer;
  730.   CDAvail := OpenCD;
  731.  
  732.   CloseCD;
  733.   CloseMixer;
  734. end.